import json
import traceback
from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status


def custom_exception_handler(exc, context):
    """
    自定义异常处理函数，用于处理API请求中的异常，
    确保返回格式一致的错误响应
    """
    # 首先调用REST framework的默认异常处理
    response = exception_handler(exc, context)
    
    # 如果response为None，则是未处理的异常
    if response is None:
        print(f"未捕获的异常: {str(exc)}")
        print(traceback.format_exc())
        
        # 返回500错误和统一格式的错误信息
        return Response({
            'status': 'error',
            'message': '服务器内部错误，请稍后再试',
            'detail': str(exc) if isinstance(exc, Exception) else 'Unknown error'
        }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    
    # 确保响应包含status和message字段
    # 如果response.data是字典类型且不包含status字段
    if isinstance(response.data, dict) and 'status' not in response.data:
        response.data = {
            'status': 'error',
            'message': response.data.get('detail', '请求处理失败'),
            'detail': response.data
        }
    # 如果response.data不是字典类型（如字符串或列表）
    elif not isinstance(response.data, dict):
        response.data = {
            'status': 'error',
            'message': str(response.data) if response.data else '请求处理失败',
            'detail': str(response.data)
        }
    
    return response


def parse_request_data(request):
    """
    解析请求数据，支持多种格式的请求体
    """
    try:
        # 如果已经是字典类型，直接返回
        if isinstance(request.data, dict):
            return request.data
        
        # 尝试解析JSON格式
        if hasattr(request, 'body') and request.body:
            try:
                return json.loads(request.body.decode('utf-8'))
            except json.JSONDecodeError:
                pass
        
        # 尝试从POST或GET参数中获取
        if request.POST:
            return {k: v for k, v in request.POST.items()}
        if request.GET:
            return {k: v for k, v in request.GET.items()}
        
        # 如果都失败，返回空字典
        return {}
    except Exception as e:
        print(f"解析请求数据错误: {str(e)}")
        return {} 